const fs = require('fs')
const dayjs = require('dayjs')
const xlsx = require('xlsx')
const { sequelize, Comment } = require('../models')
const { codeEnum, failResp, successResp } = require('../common/Enums')

const commonSql = `select
A.code as 病案号, 
A."mainDiagnosis" as 主诊断,
B."mainStatus",
B."mainDiagnosis" as 主诊断点评,
A."mainDiagnosisInInfo" as 主诊断入院病情,
B."mainDiagnosisStatus",
B."mainDiagnosisInInfo" as 主诊断入院病情点评,
A."oDiagnosis1" as 次诊断1,
B."oStatus1",
B."oDiagnosis1" as 次诊断1点评,
A."oDiagnosis1InInfo" as 次诊断1入院病情,
B."oDiagnosis1Status",
B."oDiagnosis1InInfo" as 次诊断1入院病情点评,
A."oDiagnosis2" as 次诊断2,
B."oStatus2",
B."oDiagnosis2" as 次诊断2点评,
A."oDiagnosis2InInfo" as 次诊断2入院病情,
B."oDiagnosis2Status",
B."oDiagnosis2InInfo" as 次诊断2入院病情点评,
A."oDiagnosis3" as 次诊断3,
B."oStatus3",
B."oDiagnosis3" as 次诊断3点评,
A."oDiagnosis3InInfo" as 次诊断3入院病情,
B."oDiagnosis3Status",
B."oDiagnosis3InInfo" as 次诊断3入院病情点评,
A."oDiagnosis4" as 次诊断4,
B."oStatus4",
B."oDiagnosis4" as 次诊断4点评,
A."oDiagnosis4InInfo" as 次诊断4入院病情,
B."oDiagnosis4Status",
B."oDiagnosis4InInfo" as 次诊断4入院病情点评,
A."oDiagnosis5" as 次诊断5,
B."oStatus5",
B."oDiagnosis5" as 次诊断5点评,
A."oDiagnosis5InInfo" as 次诊断5入院病情,
B."oDiagnosis5Status",
B."oDiagnosis5InInfo" as 次诊断5入院病情点评,
A."oDiagnosis6" as 次诊断6,
B."oStatus6",
B."oDiagnosis6" as 次诊断6点评,
A."oDiagnosis6InInfo" as 次诊断6入院病情,
B."oDiagnosis6Status",
B."oDiagnosis6InInfo" as 次诊断6入院病情点评,
A."oDiagnosis7" as 次诊断7,
B."oStatus7",
B."oDiagnosis7" as 次诊断7点评,
A."oDiagnosis7InInfo" as 次诊断7入院病情,
B."oDiagnosis7Status",
B."oDiagnosis7InInfo" as 次诊断7入院病情点评,
A."oDiagnosis8" as 次诊断8,
B."oStatus8",
B."oDiagnosis8" as 次诊断8点评,
A."oDiagnosis8InInfo" as 次诊断8入院病情,
B."oDiagnosis8Status",
B."oDiagnosis8InInfo" as 次诊断8入院病情点评,
A."oDiagnosis9" as 次诊断9,
B."oStatus9",
B."oDiagnosis9" as 次诊断9点评,
A."oDiagnosis9InInfo" as 次诊断9入院病情,
B."oDiagnosis9Status",
B."oDiagnosis9InInfo" as 次诊断9入院病情点评,
A."opNo1Info" as 主手术,
B."opNo1Status",
B."opNo1Info" as 主手术点评,
A."opNo2Info" as 其他手术1,
B."opNo2Status",
B."opNo2Info" as 其他手术1点评,
A."opNo3Info" as 其他手术2,
B."opNo3Status",
B."opNo3Info" as 其他手术2点评,
A."opNo4Info" as 其他手术3,
B."opNo4Status",
B."opNo4Info" as 其他手术3点评,
A."opNo5Info" as 其他手术4,
B."opNo5Status",
B."opNo5Info" as 其他手术4点评,
A."opNo6Info" as 其他手术5,
B."opNo6Status",
B."opNo6Info" as 其他手术5点评,
A."opNo7Info" as 其他手术6,
B."opNo7Status",
B."opNo7Info" as 其他手术6点评,
A."leaveHosType" as 离院方式,
B."leaveHosStatus",
B."leaveHosType" as 离院方式点评,
B."createAt" as 点评时间
from "History" A
inner join "Comment" B on A."code"=B."code" `

module.exports = {
  getByCode: async (ctx) => {
    // 通过code获取点评信息
    const { code } = ctx.params
    const comment = await Comment.findOne({ where: { code } })
    ctx.body = {
      code: codeEnum.success,
      data: comment,
      msg: '获取点评数据成功'
    }
  },
  addOrEdit: async (ctx) => {
    const comment = ctx.request.body
    if (!comment || !comment.code) {
      ctx.body = failResp('请传递点评数据')
      return
    }
    const find = await Comment.findOne({ where: { code: comment.code } })
    const nowStr = dayjs().format('YYYY-MM-DD HH:mm:ss')
    if (find === null) {
      // 说明原来的点评表中不存在记录
      comment.createAt = nowStr
      comment.updateAt = nowStr
      await Comment.create(comment)
      ctx.body = successResp(null, '点评添加成功！')
    } else {
      // 更新点评信息
      comment.updateAt = nowStr
      await Comment.update(comment, { where: { code: comment.code } })
      ctx.body = successResp(null, '点评更新成功！')
    }
  },
  exportExcel: async (ctx) => {
    console.log('请求的数据', ctx.request.body)
    const params = ctx.request.body
    let execSql = commonSql
    let excelTitle = '所有历史点评.xlsx'
    if (params.codes) {
      const codeStr = params.codes.join("','")
      execSql += ` where A.code in ('${codeStr}')`
      excelTitle = '导出选中.xlsx'
    }
    let [results] = await sequelize.query(execSql, { raw: true })
    console.log(results)
    const status = ['无', '正确', '选错', '漏填', '多填']
    const convertStatus = (idx) => {
      if (!idx) return ''
      return status[idx]
    }
    if (results && results.length) {
      results = results.map((x) => {
        let obj = {
          病案号: x['病案号'],
          主诊断: x['主诊断'],
          状态: convertStatus(x.mainStatus),
          主诊断点评: x['主诊断点评'],
          主诊断入院病情: x['主诊断入院病情'],
          主诊入院病情状态: convertStatus(x.mainDiagnosisStatus),
          主诊断入院病情点评: x['主诊断入院病情点评'],
          次诊断1: x['次诊断1'],
          次诊断1状态: convertStatus(x.oStatus1),
          次诊断1点评: x['次诊断1点评'],
          次诊断1入院病情: x['次诊断1入院病情'],
          入院病情状态1: convertStatus(x.oDiagnosis1Status),
          次诊断1入院病情点评: x['次诊断1入院病情点评'],
          次诊断2: x['次诊断2'],
          次诊断2状态: convertStatus(x.oStatus2),
          次诊断2点评: x['次诊断2点评'],
          次诊断2入院病情: x['次诊断2入院病情'],
          入院病情状态2: convertStatus(x.oDiagnosis2Status),
          次诊断2入院病情点评: x['次诊断2入院病情点评'],
          次诊断3: x['次诊断3'],
          次诊断3状态: convertStatus(x.oStatus3),
          次诊断3点评: x['次诊断3点评'],
          次诊断3入院病情: x['次诊断3入院病情'],
          入院病情状态3: convertStatus(x.oDiagnosis3Status),
          次诊断3入院病情点评: x['次诊断3入院病情点评'],
          次诊断4: x['次诊断4'],
          次诊断4状态: convertStatus(x.oStatus4),
          次诊断4点评: x['次诊断4点评'],
          次诊断4入院病情: x['次诊断4入院病情'],
          入院病情状态4: convertStatus(x.oDiagnosis4Status),
          次诊断4入院病情点评: x['次诊断4入院病情点评'],
          次诊断5: x['次诊断5'],
          次诊断5状态: convertStatus(x.oStatus5),
          次诊断5点评: x['次诊断5点评'],
          次诊断5入院病情: x['次诊断5入院病情'],
          入院病情状态5: convertStatus(x.oDiagnosis5Status),
          次诊断5入院病情点评: x['次诊断5入院病情点评'],
          次诊断6: x['次诊断6'],
          次诊断6状态: convertStatus(x.oStatus6),
          次诊断6点评: x['次诊断6点评'],
          次诊断6入院病情: x['次诊断6入院病情'],
          入院病情状态6: convertStatus(x.oDiagnosis6Status),
          次诊断6入院病情点评: x['次诊断6入院病情点评'],
          次诊断7: x['次诊断7'],
          次诊断7状态: convertStatus(x.oStatus7),
          次诊断7点评: x['次诊断7点评'],
          次诊断7入院病情: x['次诊断7入院病情'],
          入院病情状态7: convertStatus(x.oDiagnosis7Status),
          次诊断7入院病情点评: x['次诊断7入院病情点评'],
          次诊断8: x['次诊断8'],
          次诊断8状态: convertStatus(x.oStatus8),
          次诊断8点评: x['次诊断8点评'],
          次诊断8入院病情: x['次诊断8入院病情'],
          入院病情状态8: convertStatus(x.oDiagnosis8Status),
          次诊断8入院病情点评: x['次诊断8入院病情点评'],
          次诊断9: x['次诊断9'],
          次诊断9状态: convertStatus(x.oStatus9),
          次诊断9点评: x['次诊断9点评'],
          次诊断9入院病情: x['次诊断9入院病情'],
          入院病情状态9: convertStatus(x.oDiagnosis9Status),
          次诊断9入院病情点评: x['次诊断9入院病情点评'],
          主手术: x['主手术'],
          主手术状态: convertStatus(x.opNo1Status),
          主手术点评: x['主手术点评'],
          其他手术1: x['其他手术1'],
          其他手术1状态: convertStatus(x.opNo2Status),
          其他手术1点评: x['其他手术1点评'],
          其他手术2: x['其他手术2'],
          其他手术2状态: convertStatus(x.opNo3Status),
          其他手术2点评: x['其他手术2点评'],
          其他手术3: x['其他手术3'],
          其他手术3状态: convertStatus(x.opNo4Status),
          其他手术3点评: x['其他手术3点评'],
          其他手术4: x['其他手术4'],
          其他手术4状态: convertStatus(x.opNo5Status),
          其他手术4点评: x['其他手术4点评'],
          其他手术5: x['其他手术5'],
          其他手术5状态: convertStatus(x.opNo6Status),
          其他手术5点评: x['其他手术5点评'],
          其他手术6: x['其他手术6'],
          其他手术6状态: convertStatus(x.opNo7Status),
          其他手术6点评: x['其他手术6点评'],
          离院方式: x['离院方式'],
          离院方式状态: convertStatus(x.leaveHosStatus),
          离院方式点评: x['离院方式点评'],
          点评时间: x['点评时间']
        }
        return obj
      })
      const ws = xlsx.utils.json_to_sheet(results)
      const wb = xlsx.utils.book_new() // 创建一个空的workbook
      xlsx.utils.book_append_sheet(wb, ws, 'Sheet1')
      xlsx.writeFileSync(wb, excelTitle)

      //类型
      ctx.type = '.xlsx'
      //请求返回，生成的xlsx文件
      ctx.body = fs.readFileSync(excelTitle)
      //请求返回后，删除生成的xlsx文件，不删除也行，下次请求回覆盖
      fs.unlink(excelTitle, (err) => {
        if (err) {
          console.log(err)
          throw err
        }
      })
    } else {
      ctx.body = failResp('没有查询到点评数据')
    }

    /*
    const jsonData = [
      { username: 'jiang', age: 40 },
      { username: 'jancy', age: 30 },
      { username: 'test', age: 20 }
    ]
    const ws = xlsx.utils.json_to_sheet(jsonData)
    const wb = xlsx.utils.book_new() // 创建一个空的workbook
    xlsx.utils.book_append_sheet(wb, ws, 'Sheet1')
    xlsx.writeFileSync(wb, '导出测试.xlsx')

    //类型
    ctx.type = '.xlsx'
    //请求返回，生成的xlsx文件
    ctx.body = fs.readFileSync('导出测试.xlsx')
    //请求返回后，删除生成的xlsx文件，不删除也行，下次请求回覆盖
    fs.unlink('导出测试.xlsx', (err) => {
      if (err) {
        console.log(err)
        throw err
      }
    })
    */
  }
}
